package com.comtop.springboot.templet.modules.sys.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.comtop.springboot.templet.common.exception.CustomException;
import com.comtop.springboot.templet.modules.sys.mapper.SysConfigMapper;
import com.comtop.springboot.templet.modules.sys.entity.SysConfigEntity;
import com.comtop.springboot.templet.modules.sys.redis.SysConfigRedis;
import com.xiaoleilu.hutool.util.StrUtil;
import com.comtop.springboot.templet.modules.sys.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Service("sysConfigService")
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper,SysConfigEntity> implements ISysConfigService {
	@Autowired
	private SysConfigMapper sysConfigMapper;
	@Autowired
	private SysConfigRedis sysConfigRedis;
	
	@Override
	@Transactional
	public void save(SysConfigEntity config) {
		sysConfigMapper.insert(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional
	public void update(SysConfigEntity config) {
		sysConfigMapper.updateById(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional
	public void updateValueByKey(String key, String value) {
		sysConfigMapper.updateValueByKey(key, value);
		sysConfigRedis.delete(key);
	}

	@Override
	@Transactional
	public void deleteBatch(Long[] ids) {
		for(Long id : ids){
			SysConfigEntity config = sysConfigMapper.selectById(id);

			sysConfigRedis.delete(config.getKey());
		}
		List<Long> longs = Arrays.asList(ids);
		sysConfigMapper.deleteBatchIds(longs);
	}

	@Override
	public Page<SysConfigEntity> queryConfigList(Page<SysConfigEntity> page, Map<String, Object> map) {
		return page.setRecords(sysConfigMapper.queryConfigList(page,map));
	}

	@Override
	public int queryConfigTotal(Map<String, Object> map) {
		return sysConfigMapper.queryConfigTotal(map);
	}


	@Override
	public String getValue(String key) {
		SysConfigEntity config = sysConfigRedis.get(key);
		if(config == null){
			config = sysConfigMapper.queryByKey(key);
			sysConfigRedis.saveOrUpdate(config);
		}

		return config == null ? null : config.getValue();
	}
	
	@Override
	public <T> T getConfigObject(String key, Class<T> clazz) {
		String value = getValue(key);
		if(StrUtil.isNotBlank(value)){
			return JSON.parseObject(value, clazz);
		}
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			throw new CustomException("获取参数失败");
		}
	}
}
